{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Bikeshare线性回归分析"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.导入工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "#模型\n",
    "from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV\n",
    "\n",
    "#模型估计\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import r2_score\n",
    "\n",
    "#可视化\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>yr</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.180948</td>\n",
       "      <td>0.202329</td>\n",
       "      <td>0.532916</td>\n",
       "      <td>0.138482</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1606</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171197</td>\n",
       "      <td>0.170340</td>\n",
       "      <td>0.512798</td>\n",
       "      <td>0.301676</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1510</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.131919</td>\n",
       "      <td>0.109191</td>\n",
       "      <td>0.550985</td>\n",
       "      <td>0.503869</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>9</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.098690</td>\n",
       "      <td>0.048706</td>\n",
       "      <td>0.446444</td>\n",
       "      <td>0.700017</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>822</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.114266</td>\n",
       "      <td>0.094271</td>\n",
       "      <td>0.496573</td>\n",
       "      <td>0.414115</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1321</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant  season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  \\\n",
       "0        1         1         0         0         0       1       0       0   \n",
       "1        2         1         0         0         0       1       0       0   \n",
       "2        3         1         0         0         0       1       0       0   \n",
       "3        4         1         0         0         0       1       0       0   \n",
       "4        5         1         0         0         0       1       0       0   \n",
       "5        6         1         0         0         0       1       0       0   \n",
       "6        7         1         0         0         0       1       0       0   \n",
       "7        8         1         0         0         0       1       0       0   \n",
       "8        9         1         0         0         0       1       0       0   \n",
       "9       10         1         0         0         0       1       0       0   \n",
       "\n",
       "   mnth_4  mnth_5  ...  weekday_5  weekday_6      temp     atemp       hum  \\\n",
       "0       0       0  ...          0          1  0.355170  0.373517  0.828620   \n",
       "1       0       0  ...          0          0  0.379232  0.360541  0.715771   \n",
       "2       0       0  ...          0          0  0.171000  0.144830  0.449638   \n",
       "3       0       0  ...          0          0  0.175530  0.174649  0.607131   \n",
       "4       0       0  ...          0          0  0.209120  0.197158  0.449313   \n",
       "5       0       0  ...          0          0  0.180948  0.202329  0.532916   \n",
       "6       0       0  ...          1          0  0.171197  0.170340  0.512798   \n",
       "7       0       0  ...          0          1  0.131919  0.109191  0.550985   \n",
       "8       0       0  ...          0          0  0.098690  0.048706  0.446444   \n",
       "9       0       0  ...          0          0  0.114266  0.094271  0.496573   \n",
       "\n",
       "   windspeed  holiday  workingday  yr   cnt  \n",
       "0   0.284606        0           0   0   985  \n",
       "1   0.466215        0           0   0   801  \n",
       "2   0.465740        0           1   0  1349  \n",
       "3   0.284297        0           1   0  1562  \n",
       "4   0.339143        0           1   0  1600  \n",
       "5   0.138482        0           1   0  1606  \n",
       "6   0.301676        0           1   0  1510  \n",
       "7   0.503869        0           0   0   959  \n",
       "8   0.700017        0           0   0   822  \n",
       "9   0.414115        0           1   0  1321  \n",
       "\n",
       "[10 rows x 35 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv(\"FE_day.csv\")\n",
    "df.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 731 entries, 0 to 730\n",
      "Data columns (total 35 columns):\n",
      "instant         731 non-null int64\n",
      "season_1        731 non-null int64\n",
      "season_2        731 non-null int64\n",
      "season_3        731 non-null int64\n",
      "season_4        731 non-null int64\n",
      "mnth_1          731 non-null int64\n",
      "mnth_2          731 non-null int64\n",
      "mnth_3          731 non-null int64\n",
      "mnth_4          731 non-null int64\n",
      "mnth_5          731 non-null int64\n",
      "mnth_6          731 non-null int64\n",
      "mnth_7          731 non-null int64\n",
      "mnth_8          731 non-null int64\n",
      "mnth_9          731 non-null int64\n",
      "mnth_10         731 non-null int64\n",
      "mnth_11         731 non-null int64\n",
      "mnth_12         731 non-null int64\n",
      "weathersit_1    731 non-null int64\n",
      "weathersit_2    731 non-null int64\n",
      "weathersit_3    731 non-null int64\n",
      "weekday_0       731 non-null int64\n",
      "weekday_1       731 non-null int64\n",
      "weekday_2       731 non-null int64\n",
      "weekday_3       731 non-null int64\n",
      "weekday_4       731 non-null int64\n",
      "weekday_5       731 non-null int64\n",
      "weekday_6       731 non-null int64\n",
      "temp            731 non-null float64\n",
      "atemp           731 non-null float64\n",
      "hum             731 non-null float64\n",
      "windspeed       731 non-null float64\n",
      "holiday         731 non-null int64\n",
      "workingday      731 non-null int64\n",
      "yr              731 non-null int64\n",
      "cnt             731 non-null int64\n",
      "dtypes: float64(4), int64(31)\n",
      "memory usage: 200.0 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.设置训练和测试数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train samples: (584, 34)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\H\\AppData\\Local\\conda\\conda\\envs\\tansorflow\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2179: FutureWarning: From version 0.21, test_size will always complement train_size unless both are specified.\n",
      "  FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "#设置输出y为“cnt”变量\n",
    "y = df[\"cnt\"]\n",
    "#设置其他变量的为X特征，删去要预测的变量，axis=1表示删除列。\n",
    "X =df.drop([\"cnt\"], axis=1)\n",
    " \n",
    "#20%做测试数据，其余的做训练数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.8,random_state = 0)\n",
    "\n",
    "print (\"train samples:\" , X_train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Index(['season_1', 'season_2', 'season_3', 'season_4', 'mnth_1', 'mnth_2',\n",
      "       'mnth_3', 'mnth_4', 'mnth_5', 'mnth_6', 'mnth_7', 'mnth_8', 'mnth_9',\n",
      "       'mnth_10', 'mnth_11', 'mnth_12', 'weathersit_1', 'weathersit_2',\n",
      "       'weathersit_3', 'weekday_0', 'weekday_1', 'weekday_2', 'weekday_3',\n",
      "       'weekday_4', 'weekday_5', 'weekday_6', 'temp', 'atemp', 'hum',\n",
      "       'windspeed', 'holiday', 'workingday', 'yr'],\n",
      "      dtype='object')\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\H\\AppData\\Local\\conda\\conda\\envs\\tansorflow\\lib\\site-packages\\pandas\\core\\frame.py:3940: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n",
      "  errors=errors)\n"
     ]
    }
   ],
   "source": [
    "#保存测试ID，用于结果提交\n",
    "testID = X_test['instant']\n",
    "\n",
    "#ID不参与预测\n",
    "X_train.drop(['instant'], axis=1, inplace = True)\n",
    "X_test.drop(['instant'], axis=1, inplace = True)\n",
    "\n",
    "#保存特征\n",
    "feat_names = X_train.columns\n",
    "print(feat_names)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.运用训练模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.1 最小二乘线性回归模型\n",
    "Linear Regression without regularization\n",
    "### 4.1.1 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#使用Linear Regression\n",
    "#1. 生成模型实例\n",
    "lr = LinearRegression()\n",
    "\n",
    "#2. 用训练数据训练模型\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "#3. 用训练好的模型进行预测\n",
    "y_train_pred = lr.predict(X_train)\n",
    "y_test_pred = lr.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.2 对训练完的模型进行性能评估\n",
    "####   RMSE是预测值与真实值的误差平方根的均值\n",
    "####   R2 决定系数（拟合优度）模型越好：r2→1 模型越差：r2→0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSE on Training set : 752.2641169543666\n",
      "RMSE on Testing set : 785.609115051007\n",
      "r2_score on Training set : 0.8436740400232239\n",
      "r2_score on Testing set : 0.8548880893459053\n"
     ]
    }
   ],
   "source": [
    "#对预测数据求RMSE\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pred))\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test, y_test_pred))\n",
    "print(\"RMSE on Training set :\", rmse_train)\n",
    "print(\"RMSE on Testing set :\", rmse_test)\n",
    "\n",
    "#对预测数据求R2系数\n",
    "r2_score_train = r2_score(y_train, y_train_pred)\n",
    "r2_score_test = r2_score(y_test, y_test_pred)\n",
    "print(\"r2_score on Training set :\", r2_score_train)\n",
    "print(\"r2_score on Testing set :\", r2_score_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.3 特征重要性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ -804.64804582,    45.68500053,    58.09108259,   700.87196269,\n",
       "        -281.06463485,  -186.42363521,   238.55005026,    32.66932106,\n",
       "         427.12124864,     4.08599721,  -429.2588373 ,    48.76684032,\n",
       "         664.02536558,   215.19726972,  -405.00773932,  -328.66124609,\n",
       "         718.86265112,   361.71909201, -1080.58174312,  -156.67384234,\n",
       "        -148.1020523 ,   -53.85635947,    -9.71054887,    54.37546294,\n",
       "          78.2901677 ,   235.67717232,  2815.80146724,  1075.71122802,\n",
       "       -1884.93624337, -1512.25510289,  -228.90398686,   149.90065687,\n",
       "        1938.70043415])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ridge picked 33 features and eliminated the other 0 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#各维度系数\n",
    "coefs = pd.Series(lr.coef_, index = feat_names)\n",
    "print(\"Ridge picked \" + str(sum(coefs != 0)) + \" features and eliminated the other \" +  \\\n",
    "      str(sum(coefs == 0)) + \" features\")\n",
    "\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                      coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the OLS Model\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "season_1        -804.648046\n",
       "season_2          45.685001\n",
       "season_3          58.091083\n",
       "season_4         700.871963\n",
       "mnth_1          -281.064635\n",
       "mnth_2          -186.423635\n",
       "mnth_3           238.550050\n",
       "mnth_4            32.669321\n",
       "mnth_5           427.121249\n",
       "mnth_6             4.085997\n",
       "mnth_7          -429.258837\n",
       "mnth_8            48.766840\n",
       "mnth_9           664.025366\n",
       "mnth_10          215.197270\n",
       "mnth_11         -405.007739\n",
       "mnth_12         -328.661246\n",
       "weathersit_1     718.862651\n",
       "weathersit_2     361.719092\n",
       "weathersit_3   -1080.581743\n",
       "weekday_0       -156.673842\n",
       "weekday_1       -148.102052\n",
       "weekday_2        -53.856359\n",
       "weekday_3         -9.710549\n",
       "weekday_4         54.375463\n",
       "weekday_5         78.290168\n",
       "weekday_6        235.677172\n",
       "temp            2815.801467\n",
       "atemp           1075.711228\n",
       "hum            -1884.936243\n",
       "windspeed      -1512.255103\n",
       "holiday         -228.903987\n",
       "workingday       149.900657\n",
       "yr              1938.700434\n",
       "dtype: float64"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.4 分析\n",
    "#### 从计算得出的两个RMSE都为700多，比较大。预测的误差还是比较大的\n",
    "#### r2系数在0.85左右，没有另一个可作为对比。但越接近于1越好\n",
    "#### 特征系数的值有几个如年，体感温度，温度，湿度相比其他特别大"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.2 岭回归模型\n",
    "Linear Regression with Ridge regularization (L2 penalty)\n",
    "### 4.2.1 实例化训练模型并进行预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "#1. 设置超参数搜索范围，生成模型实例\n",
    "alphas = [0.01, 0.1, 1, 10, 100, 1000]\n",
    "ridge = RidgeCV(alphas=alphas, store_cv_values=True)\n",
    "\n",
    "#2. 用训练数据进行训练\n",
    "ridge.fit(X_train, y_train)\n",
    "\n",
    "#3 用训练数据及测试数据进行预测\n",
    "y_train_pred = ridge.predict(X_train)\n",
    "y_test_pred = ridge.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2.2 误差性能评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best alpha: 1.0\n",
      "cv of rmse : [ 804.98946948  801.06246694  797.95313648  822.15888399 1078.04194503\n",
      " 1680.07803178]\n",
      "RMSE on Training set : 754.0366623762021\n",
      "RMSE on Test set : 776.9753607133537\n",
      "r2_score on Training set : 0.842936476406777\n",
      "r2_score on Test set : 0.8580600896877723\n"
     ]
    }
   ],
   "source": [
    "#通过交叉验证得到的最佳超参数\n",
    "alpha = ridge.alpha_\n",
    "print (\"Best alpha:\", alpha)\n",
    "\n",
    "#交叉验证估计的测试误差\n",
    "mse_cv = np.mean(ridge.cv_values_, axis=0)\n",
    "rmse_cv = np.sqrt(mse_cv)\n",
    "print(\"cv of rmse :\", rmse_cv)\n",
    "\n",
    "#测试误差\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pred))\n",
    "print(\"RMSE on Training set :\", rmse_train)\n",
    "\n",
    "#预测误差\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test,y_test_pred))\n",
    "print(\"RMSE on Test set :\" ,rmse_test)\n",
    "\n",
    "#求R2系数\n",
    "r2_score_train = r2_score(y_train,y_train_pred)\n",
    "r2_score_test = r2_score(y_test,y_test_pred)\n",
    "print(\"r2_score on Training set :\" ,r2_score_train)\n",
    "print(\"r2_score on Test set :\" ,r2_score_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2.3 特征重要性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ridge picked 33 features and eliminated the other 0 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot important coefficients\n",
    "coefs = pd.Series(ridge.coef_, index = feat_names)\n",
    "print(\"Ridge picked \" + str(sum(coefs != 0)) + \" features and eliminated the other \" +  \\\n",
    "      str(sum(coefs == 0)) + \" features\")\n",
    "\n",
    "#正系数值最大的10个特征和负系数值最小（绝对值大）的10个特征\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                     coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the Ridge Model\")\n",
    "plt.show()\n",
    "\n",
    "mse_mean = np.mean(ridge.cv_values_, axis = 0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas),1)) \n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "season_1        -816.946054\n",
       "season_2          61.439057\n",
       "season_3          97.124573\n",
       "season_4         658.382424\n",
       "mnth_1          -384.604861\n",
       "mnth_2          -255.398769\n",
       "mnth_3           185.553801\n",
       "mnth_4            -6.012570\n",
       "mnth_5           437.523845\n",
       "mnth_6           104.170972\n",
       "mnth_7          -307.981162\n",
       "mnth_8           129.351248\n",
       "mnth_9           670.800620\n",
       "mnth_10          235.474439\n",
       "mnth_11         -428.094512\n",
       "mnth_12         -380.783051\n",
       "weathersit_1     757.284463\n",
       "weathersit_2     341.945472\n",
       "weathersit_3   -1099.229935\n",
       "weekday_0       -166.919676\n",
       "weekday_1       -155.850725\n",
       "weekday_2        -48.116950\n",
       "weekday_3         -4.759450\n",
       "weekday_4         64.295894\n",
       "weekday_5         87.446625\n",
       "weekday_6        223.904283\n",
       "temp            1892.310062\n",
       "atemp           1605.349484\n",
       "hum            -1520.738791\n",
       "windspeed      -1336.567102\n",
       "holiday         -202.590794\n",
       "workingday       145.606188\n",
       "yr              1952.328786\n",
       "dtype: float64"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2.4 分析\n",
    "RMSE值比OLS小一点，预测值与真实值的误差小一点。\n",
    "\n",
    "r2系数在0.85左右，跟OLS模型结果差不多\n",
    "\n",
    "特征系数从图表来说相对于OLS模型，更接近于中心点0,在数值比较大的几个特征属性数值比OLS模型要小，模型相对更加稳定。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.3 Lasso模型\n",
    "Linear Regression with Lasso regularization (L1 penalty)\n",
    "### 4.3.1 实例化训练模型并进行预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\H\\AppData\\Local\\conda\\conda\\envs\\tansorflow\\lib\\site-packages\\sklearn\\model_selection\\_split.py:2053: FutureWarning: You should specify a value for 'cv' instead of relying on the default value. The default value will change from 3 to 5 in version 0.22.\n",
      "  warnings.warn(CV_WARNING, FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "#1. 实例化训练模型，LassoCV默认参数可自动确定alpha的搜索范围\n",
    "lasso = LassoCV()\n",
    "\n",
    "#2. 模型训练\n",
    "lasso.fit(X_train, y_train)\n",
    "\n",
    "#3. 使用训练好的模型进行预测\n",
    "y_train_pred = lasso.predict(X_train)\n",
    "y_test_pred = lasso.predict(X_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3.2 模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best alpha: 2.336453166053946\n",
      "RMSE on Training set : 754.2656275844785\n",
      "RMSE on Test set : 786.6230585764281\n",
      "cv of rmse : 828.5550460506812\n",
      "r2_score on Training set : 0.8428410764237866\n",
      "r2_score on Test set : 0.8545132713117076\n"
     ]
    }
   ],
   "source": [
    "#最佳的alpha\n",
    "alpha = lasso.alpha_\n",
    "print(\"Best alpha:\", alpha)\n",
    "\n",
    "#测试误差\n",
    "rmse_train = np.sqrt(mean_squared_error(y_train,y_train_pred))\n",
    "print(\"RMSE on Training set :\", rmse_train)\n",
    "\n",
    "#预测误差\n",
    "rmse_test = np.sqrt(mean_squared_error(y_test,y_test_pred))\n",
    "print(\"RMSE on Test set :\" ,rmse_test)\n",
    "\n",
    "#模型性能 ：cv\n",
    "mse_cv = np.mean(lasso.mse_path_, axis = 1)\n",
    "rmse_cv = np.sqrt(mse_cv)\n",
    "print (\"cv of rmse :\", min(rmse_cv))\n",
    "\n",
    "#求R2系数\n",
    "r2_score_train = r2_score(y_train,y_train_pred)\n",
    "r2_score_test = r2_score(y_test,y_test_pred)\n",
    "print(\"r2_score on Training set :\" , r2_score_train)\n",
    "print(\"r2_score on Test set :\" , r2_score_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.3.3 特征关系"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Lasso picked 27 features and eliminated the other 6 features\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#显示不同alpha对应的模型性能\n",
    "plt.plot(np.log10(lasso.alphas_), mse_cv)\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show() \n",
    "\n",
    "#特征重要性\n",
    "coefs = pd.Series(lasso.coef_, index = feat_names)\n",
    "print(\"Lasso picked \" + str(sum(coefs != 0)) + \" features and eliminated the other \" +  \\\n",
    "      str(sum(coefs == 0)) + \" features\")\n",
    "imp_coefs = pd.concat([coefs.sort_values().head(10),\n",
    "                     coefs.sort_values().tail(10)])\n",
    "imp_coefs.plot(kind = \"barh\")\n",
    "plt.title(\"Coefficients in the Lasso Model\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "season_1        -991.864539\n",
       "season_2          -0.000000\n",
       "season_3           0.000000\n",
       "season_4         448.139977\n",
       "mnth_1          -152.357646\n",
       "mnth_2           -46.677131\n",
       "mnth_3           272.393334\n",
       "mnth_4            -0.000000\n",
       "mnth_5           364.227409\n",
       "mnth_6             0.000000\n",
       "mnth_7          -395.772042\n",
       "mnth_8            10.784305\n",
       "mnth_9           641.369561\n",
       "mnth_10          352.506349\n",
       "mnth_11         -209.768543\n",
       "mnth_12         -153.539040\n",
       "weathersit_1     388.138775\n",
       "weathersit_2      -0.000000\n",
       "weathersit_3   -1429.882687\n",
       "weekday_0       -273.619964\n",
       "weekday_1       -134.265169\n",
       "weekday_2        -22.758843\n",
       "weekday_3         -0.000000\n",
       "weekday_4         47.064979\n",
       "weekday_5         77.322211\n",
       "weekday_6         82.220008\n",
       "temp            2964.600668\n",
       "atemp            863.906434\n",
       "hum            -1618.968372\n",
       "windspeed      -1382.149139\n",
       "holiday         -301.586913\n",
       "workingday         1.389914\n",
       "yr              1941.529523\n",
       "dtype: float64"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "coefs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 4.3.4 分析\n",
    "Lasso模型增加了L1正则，系数值进一步收缩，同时有些特征的系数为0。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 生成文件保存"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.DataFrame({\"instant\":testID, \"cnt\":y_test_pred})\n",
    "df.to_csv(\"submission.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 147 entries, 196 to 239\n",
      "Data columns (total 2 columns):\n",
      "instant    147 non-null int64\n",
      "cnt        147 non-null float64\n",
      "dtypes: float64(1), int64(1)\n",
      "memory usage: 3.4 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
